"""

    并发运行任务 - gather

"""
import asyncio
import aiohttp
from async_web import async_timed, fetch_status


async def delay(seconds):
    print(f"sleep for {seconds} seconds")
    await asyncio.sleep(seconds)


@async_timed()
async def main():
    async with aiohttp.ClientSession() as session:
        urls = ["http://www.baidu.com" for _ in range(10)]
        # 为要发出的每个请求生成一个协程列表
        requests = [fetch_status(session, url) for url in urls]
        # 等待所有请求完成，gather将包装在一个任务中的所有协程，同时执行
        # 并且gather好处是：它的返回结果顺序与请求顺序一致，是有序的。
        result = await asyncio.gather(*requests)
        successful_results = [res for res in result if not isinstance(res, Exception)]

# gather缺点之一：当我们看到异常时，没有简单的方法可以取消已经在运行的任务。
# gather异常情况下，异常的会进行抛错，不会影响其他协程的执行
# 同时必须等待所有协程执行完成，才能处理结果，如果一个协程处理花费20s，其他协程花费1s，那么需要等待20s才行
# 现在如何解决这个问题，让有结果的直接处理？ - as_complete

asyncio.run(main())
